地址簇

  • socket.AF_INET =2 — TCP/IP – IPv4
  • socket.AF_INET6 =10 — TCP/IP – IPv6

套接字类型

  • socket.SOCK_STREAM =1 — TCP流
  • socket.SOCK_DGRAM =2 — UDP数据报
  • socket.SOCK_RAW =3 — 原始套接字
  • socket.SO_REUSEADDR =4 — socket可重用

IP协议号

  • socket.IPPROTO_TCP =16
  • socket.IPPROTO_UDP =17

套接字选项级别

  • socket.SOL_SOCKET =4095

函数

1. socket.socket([af, type, proto])

函数说明:创建套接字。

af:地址
type:类型
proto:协议号


注意:
   一般不指定proto参数,因为有些MicroPython固件提供默认参数。
示例:

>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> print(s)
<socket>

1.1. socket.socket.setsockopt(level, optname, value)

函数说明:根据选项值设置套接字。

level:套接字选项级别
optname:套接字的选项
value:可以是一个整数,也可以是一个表示缓冲区的bytes类对象。

示例:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

1.2. socket.socket.bind(address)

函数说明:以列表或元组的方式绑定地址和端口号。

address:一个包含地址和端口号的列表或元组。

示例:

addr = ("127.0.0.1",10000)
s.bind(addr)

1.3. socket.socket.listen([backlog])

函数说明:监听套接字,使服务器能够接收连接。

backlog:接受套接字的最大个数,至少为0,如果没有指定,则默认一个合理值。

1.4. socket.socket.accept()

函数说明:接收连接请求。
注意:
   只能在绑定地址端口号和监听后调用,返回conn和address。

conn:新的套接字对象,可以用来收发消息
address:连接到服务器的客户端地址

示例:

conn,addr = s.accept()

1.5. socket.socket.connect(address)

函数说明:连接服务器。

address:服务器地址和端口号的元组或列表

示例:

host = "192.168.3.147"
port = 100
s.connect((host, port))

1.6. socket.socket.send(bytes)

函数说明:发送数据,并返回发送的字节数。

bytes:bytes类型数据

示例:

s.send("hello DFRobot, I am TCP Client")

1.7. socket.socket.sendall(bytes)

函数说明:与send()函数类似,区别是sendall()函数通过数据块连续发送数据。

bytes:bytes类型数据

示例:

s.sendall("hello DFRobot, I am TCP Client")

1.8. socket.socket.sendto(bytes, address)

函数说明:发送数据,目标由address决定,用于UDP通信,返回发送的数据大小。

bytes:bytes类型数据
address:目标地址和端口号的元组

示例:

data = sendto("hello DFRobot", ("192.168.3.147", 100))

1.9. socket.socket.recv(bufsize)

函数说明:接收数据,返回接收到的数据对象。

bufsize:指定一次接收的最大数据量

示例:

data = conn.recv(1024)

1.10. socket.socket.recvfrom(bufsize)

函数说明:接收数据,用于UDP通信,并返回接收到的数据对象和对象的地址。

bufsize:指定一次接收的最大数据量

示例:

data,addr=fd.recvfrom(1024)

1.11. socket.socket.settimeout(value)

函数说明:设置超时时间,单位:秒。
示例:

s.settimeout(2)

1.12. socket.socket.readline()

函数说明:接收一行数据,遇换行符结束,并返回接收数据的对象 。

1.13. socket.socket.write(buf)

函数说明:将字节类型数据写入套接字,并返回写入数据的大小。

1.14. socket.socket.close()

函数说明:关闭套接字。
示例:

s.close()

2. socket.getaddrinfo(host, port)

函数说明:将主机域名(host)和端口(port)转换为用于创建套接字的5元组序列。元组列表的结构如下:

(family, type, proto, canonname, sockaddr)

示例:

>>> info = socket.getaddrinfo("127.0.0.1", 10000)
>>> print(info)
[(2, 1, 0, '127.0.0.1', ('127.0.0.1', 10000))]

综合示例

   保存下面的代码为.py文件,要运行这个代码,你要确保连接了WiFi。

import network
import socket
import time

SSID = "dfrobotYanfa"  #修改为你的WiFi名称
PASSWORD = "hidfrobot"  #修改为你WiFi密码
port = 10000  #端口号
wlan = None  #wlan
listenSocket = None  #套接字

#连接WiFi
def connectWifi(ssid,passwd):   
  global wlan
  wlan = network.WLAN(network.STA_IF) 
  wlan.active(True)   #激活网络
  wlan.disconnect()   #断开WiFi连接
  wlan.connect(ssid, passwd)   #连接WiFi
  while(wlan.ifconfig()[0] == '0.0.0.0'):   #等待连接
    time.sleep(1)
  return True

#Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
  connectWifi(SSID,PASSWORD)
  ip = wlan.ifconfig()[0]   #获取IP地址
  listenSocket = socket.socket()   #创建套接字
  listenSocket.bind((ip, port))   #绑定地址和端口号
  listenSocket.listen(1)   #监听套接字
  listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   #设置套接字
  print ('tcp waiting...')

  while True:
    print("accepting.....")
    conn, addr = listenSocket.accept()   #接收连接请求,返回收发数据的套接字对象和客户端地址
    print(addr, "connected")

    while True:
      data = conn.recv(1024)   #接收数据(1024字节大小)
      if(len(data) == 0):   #判断客户端是否断开连接
        print("close socket")
        conn.close()   #关闭套接字
        break
      print(data)
      ret = conn.send(data)   #发送数据
except:
  if(listenSocket):   #判断套接字是否为空
    listenSocket.close()   #关闭套接字
  wlan.disconnect()   #断开WiFi
  wlan.active(False)   #冻结网络

运行结果

客户端:

results matching ""

    No results matching ""